import java.util.Scanner;  
  
public class Main {
    public static void main(String[] args) {
        Emp[] emp = new Emp[5];
        Use[] use = new Use[5];
        for (int i = 0; i < 5; i++) {
            Emp e = new Emp();
            emp[i] = e;
            Use u = new Use();
            use[i] = u;
            emp[i].status = 0;
            emp[i].add = 0;
            emp[i].length = 0;
            use[i].add = 0;
            use[i].length = 0;
            use[i].status = 0;
        }
        emp[0].add = 600;//起始地址
        emp[0].length = 2500;//最大内存
        emp[0].status = 1;//1 表示可用 2表示不可用
        while (true) {
            System.out.println("|-------------------------------------------------|");
            System.out.println("|----------------------主菜单---------------------|");
            System.out.println("|                                               |");
            System.out.println("|  1----分配                                   |");
            System.out.println("|  2----回收                                   |");
            System.out.println("|  3----显示                                   |");
            System.out.println("|  0----退出                                   |");
            System.out.println("|                                               |");
            System.out.println("|-------------------------------------------------|");
            System.out.println("\n请输入你的选择(0-3):");
            Scanner scanner = new Scanner(System.in);
            int select = scanner.nextInt();
            switch (select) {
                case 1:
                    Distribute(emp, use);
                    break;
                case 2:
                    Recycling(emp, use);
                    break;
                case 3:
                    Print(emp, use);
                    break;
                case 0:
                    return;
            }
        }
    }

    private static void Print(Emp[] emp, Use[] use) {
        int count = 0; // 计数器，用于统计空闲分区数。
        System.out.println("------------空闲分区表：------------"); // 打印标题。
        for (int i = 0; i < emp.length; i++) { // 遍历所有员工（实际上应该是分区表，这里为了简单起见使用员工类）。
            if (emp[i].status == 1) { // 如果员工状态为空闲。
                count++; // 计数器加一。
                System.out.println(count + ". 起始地址：" + emp[i].add + " 空间：" + emp[i].length
                        + " 状态：" + emp[i].status); // 打印员工信息。
            }
        }
        System.out.println(); // 打印一个换行符。
        System.out.println("-----分区使用表：-----"); // 打印标题。
        for (int i = 0; i < use.length; i++) { // 遍历所有使用的分区（作业）。
            if (use[i].status == 1) { // 如果作业状态为进行中。
                System.out.println(" 作业名：" + use[i].name + " 起始地址：" + use[i].add
                        + " 空间：" + use[i].length + " 状态：" + use[i].status); // 打印作业信息。
            }
        }
        System.out.println();
    }

    private static void Recycling(Emp[] emplist, Use[] uselist) {
        Scanner scanner = new Scanner(System.in);
        int i, m, n;
        System.out.println("请输入作业名：");
        String name = scanner.nextLine();

        for (i = 0; i < uselist.length; i++) {
            if (uselist[i].status == 1 && uselist[i].name.equals(name)) {
                uselist[i].status = 0;
                break;
            }
        }

        if (i != uselist.length) {
            for (n = 0; n < emplist.length; n++) {
                if (emplist[n].status == 1 && emplist[n].add + emplist[n].length == uselist[i].add) {
                    break;
                }
            }
            for (m = 0; m < emplist.length; m++) {
                if (emplist[m].status == 1 && emplist[m].add == uselist[i].length + uselist[i].add) {
                    break;
                }
            }
            if (n != emplist.length) {
                if (m != emplist.length) {
                    emplist[n].length += emplist[m].length + uselist[i].length;
                    emplist[m].status = 0;
                } else {
                    emplist[n].length += uselist[i].length;
                }
            } else {
                if (m != emplist.length) {
                    emplist[m].length += uselist[i].length;
                    emplist[m].add = uselist[i].add;
                } else {
                    for (n = 0; n < emplist.length; n++) {
                        if (emplist[n].status == 0) {
                            emplist[n].status = 1;
                            emplist[n].length = uselist[i].length;
                            emplist[n].add = uselist[i].add;
                            break;
                        }
                    }
                    for (n = 0; n < emplist.length - 1; n++) {
                        for (m = 0; m < emplist.length - 1 - n; m++) {
                            if (emplist[m].add > emplist[m + 1].add && emplist[m].status == 1 && emplist[m + 1].status == 1) {
                                Emp temp = emplist[m];
                                emplist[m] = emplist[m + 1];
                                emplist[m + 1] = temp;
                            }
                        }
                    }
                }
            }
        } else {
            System.out.println("该作业不存在。");
        }
    }


    public static void Distribute(Emp emplist[], Use uselist[]) {  
        Scanner scanner = new Scanner(System.in);  
        System.out.println("请输入作业名：");  
        String name = scanner.nextLine();  
        System.out.println("请输入内存大小：");  
        int RAM = scanner.nextInt();  
        int i, j;  
        for (i = 0; i < emplist.length; i++) {  
            if (emplist[i].status == 1 && emplist[i].length >= RAM) {  
                emplist[i].length -= RAM;  
                emplist[i].add += RAM;  
                if (emplist[i].length == 0) emplist[i].status = 0;  
                for (j = 0; j < uselist.length; j++) {  
                    if (uselist[j].status == 0) break;  
                }  
                if (j == uselist.length) {  
                    System.out.println("分区使用表已满。");  
                } else {  
                    uselist[j].name = name;  
                    uselist[j].add = emplist[i].add - RAM;  
                    uselist[j].length = RAM;  
                    uselist[j].status = 1;  
                }  
                break;  
            }  
        }  
        if (i == emplist.length) {  
            System.out.println("空闲分区已满，作业需要继续等待。");  
        }  
    }  
}